﻿using AutoMapper;
using Max.PH4.Shoppgin.Admin.Domain;
using Max.PH4.Shoppgin.Admin.DTO;
using Max.PH4.Shoppgin.Admin.IRespository;
using Max.PH4.Shoppgin.Admin.IService;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Max.PH4.Shoppgin.Admin.Service
{
    /// <summary>
    /// 系统用户的服务实现类
    /// </summary>
    public class SystemUserService : ISystemUserService
    {
        /*
         * 依赖于接口，所以我们用的是系统用户的仓储接口，而不是系统用户的仓储实现
         * **/
        /// <summary>
        /// 系统用户的仓储接口
        /// </summary>
        ISystemUserRespository _respository;
        IMapper _map;
        public SystemUserService(ISystemUserRespository respository, IMapper map)
        {
            _respository = respository;
            _map = map;
        }

        #region 20230619 后台管理的用户登录

        public (bool, string, SystemUserLoginOutputDto) Login(string userName, string password)
        {
            try
            {
                var m = _respository.Query().Where(x => x.Name.Equals(userName)).FirstOrDefault();
                if (m == null)
                {
                    //数据为空，说明：用户名不存在
                    return (false, "用户名不存在", null);
                }

                //对用户输入密码，进行MD5加密处理
                //password = MD5Hash.Hash.Content(password);
                //将加密后密码和数据库中的密码进行匹配
                if (m.Password.Equals(password))
                {
                    //密码正确，说明：登录成功
                    var dto =  _map.Map<SystemUserEntity, SystemUserLoginOutputDto>(m);

                    return (true, "登录成功", dto);
                }
                else
                {
                    return (false, "密码错误", null);
                }
            }
            catch (Exception ex)
            {
                return (false, $"服务器错误！错误原因：{ex.Message}", null);
            }
        }
        #endregion

        #region 基本的操作管理

        public int Delete(SystemUserEntity entity)
        {
            int result = _respository.Delete(entity);
            return result;
        }

        public int Delete(object id)
        {
            int result = _respository.Delete(id);
            return result;
        }
        /*
         * 添加新操作用户时，
         * 1、需要验证用户名是否重复
         * 2、需要对密码进行MD5加密处理
         *      1)安装包MD5
         * **/

        //添加后台的操作用户
        public (bool, string) Insert(SystemUserEntity entity)
        {
            try
            {
                //不允许数据库中，出现重复登录名称，所以需要在添加之前，进行重复性的验证判断
                var m = _respository.Query().Where(x => x.Name.Equals(entity.Name)).FirstOrDefault();
                if (m != null)
                {
                    //m不等于Null,说明数据库中已存该用户登录名
                    return (false, "登录名已存在");
                }

                //在添加之前对用户输入的密码进行加密处理
                entity.Password = MD5Hash.Hash.Content(entity.Password);

                int result = _respository.Insert(entity);
                if (result > 0)
                {
                    return (true, "添加成功");
                }
                return (false, "添加失败");
            }
            catch (Exception ex)
            {
                return (false, $"添加失败，具体原因：{ex.Message}");
            }

        }


        public List<SystemUserOutputDto> Query()
        {
            var result = _respository.Query().ToList();

            var q = _map.Map<List<SystemUserEntity>, List<SystemUserOutputDto>>(result);

            return q;
        }

        //根据条件查询
        public IQueryable<SystemUserOutputDto> Query(string name)
        {
            var result = _respository.Query().Where(x => x.Name.Contains(name)).ToList();

            var q = _map.Map<List<SystemUserEntity>, List<SystemUserOutputDto>>(result);
            return q.AsQueryable();
        }

        public IQueryable<SystemUserOutputDto> Query(string name, int pageIndex, int pageSize, out int total)
        {
            //先查询
            var result = _respository.Query().Where(x => x.Name.Contains(name)).ToList();
            //符合条件的总记录数
            total = result.Count();

            //对符合条件的数据进行分页
            result = result.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();

            var q = _map.Map<List<SystemUserEntity>, List<SystemUserOutputDto>>(result);

            return q.AsQueryable();
        }

        public int Update(SystemUserEntity entity)
        {
            int result = _respository.Update(entity);
            return result;
        }

        #endregion
    }
}
